package ViewsTUI;

import Controllers.*;
import Models.*;
import byggemarked.Console;
import java.util.ArrayList;
import java.util.Date;

/**
 * @author Tanja
 */
public class StockView
{
    private ItemCTR controller;

    public StockView()
    {
       this.controller = new ItemCTR();

       ArrayList<String> options = new ArrayList<String>();
		options.add("Tilføj vare");
		options.add("Find vare");
		options.add("Hent vare");
		options.add("Redigér vare");
		options.add("Slet vare");

        boolean isTimeToQuit = false;
		while(!isTimeToQuit)
		{
			Console.printMenu(true, "Lager", options);
			int choice = Console.readChoice(0, 4);
			switch(choice)
			{
				case 1: addItem();      break;
				case 2: findItem();     break;
				case 3: getItem();		break;
				case 4: editItem();     break;
				case 5: removeItem();	break;
				case 0: isTimeToQuit = true;
			}
		}
    }

    private void addItem()
    {
        Console.print("Indtast varenavn:");
        String name = Console.readString();

        Console.print("Indtast varebeskrivelse:");
        String description = Console.readString();

		Console.print("Indtast producent:");
        String manufacturer = Console.readString();

        Console.print("Indtast leverandør:");
		String supplier = Console.readString();

        Console.print("Indtast pris:");
        double price = Console.readDouble();

        Console.print("Indtast lokation - 1 for Trælasthandelen, 2 for byggemarkedet:");
        int locationInt = Console.readInt();
        Location location;
        if(locationInt == 1)
        {
            location = Location.LumberYard;
        }
        else
        {
            location = Location.HardwareStore;
        }

        Console.print("Indtast minimumslager:");
        int minimumStock = Console.readInt();

        Console.print("Indtast maximumslager:");
        int maximumStock = Console.readInt();

		//TODO: Supplierfix
		this.controller.addItem(name, description, manufacturer, SupplierCollection.getInstance().getSupplier(100), price, location, minimumStock, maximumStock);
    }

    private void findItem(boolean standAlone)
    {
        Console.print("For at søge efter en vare, skal du indtaste mindst et af søgekriterierne.");
        Console.print("Indtast varenavn:");
        String name = Console.readString(true);

        Console.print("Indtast beskrivelse af varen:");
        String description = Console.readString(true);

        Console.print("Indtast producent:");
        String manufacturer  = Console.readString(true);

		Console.print("Indtast leverandør:");
		String supplier = Console.readString(true);

        Console.print("Indtast pris:");
        double price = Console.readDouble(true);

        Console.print("Indtast anskaffelsesdato:");
        Date acquisitionDate = Console.readDate(true);

        Console.print("Indtast lokation for varen:");
        int locationInt = Console.readInt(true);
        Location location;
        switch(locationInt)
        {
			case 1:
				location = Location.LumberYard;
				break;
			case 2:
				location = Location.HardwareStore;
				break;
			default:
				location = null;
		}

        Console.print("Indtast en værdi for minimumslager:");
        int minimumStock = Console.readInt(true);

        Console.print("Indtast en værdi for maximumslager:");
        int maximumStock = Console.readInt(true);

		//TODO: Supplierfix
		ArrayList<Item> items = this.controller.findItem(name, description, manufacturer, SupplierCollection.getInstance().getSupplier(100), price, acquisitionDate, location, minimumStock, maximumStock);
        if(items.size() > 0)
		{
			this.showList(items);
			if(standAlone)
			{
				Console.print("Indtast den ønskede kundes ID, som står ude til venstre i listen.");
				int id = Console.readInt();
				Item customer = this.controller.getItem(id);
				if(customer != null)
				{
					this.showInfo(customer);
				}
				else
				{
					Console.print("Der kunne ikke findes nogen kunde med det valgte ID.");
				}
			}
		}
		else
		{
			Console.print("Der fandtes ingen kunder med de indtastede søgekriterier.");
		}
	}

	private void findItem()
	{
		this.findItem(true);
    }

	private void getItem()
	{
		Console.print("Indtast varens ID.");
		int itemInt = Console.readInt();
		Item item = this.controller.getItem(itemInt);
		if(item != null)
		{
			showInfo(item);
		}
		else
		{
			Console.print("Der kunne ikke findes nogen vare med det valgte ID.");
		}
	}

    private void editItem()
    {
		Console.print("For at redigere en vare, skal den først findes.");
		Item item = null;
		boolean hasValidItem = false;
		while(!hasValidItem)
		{
			try
			{
				item = searchProcedure();
				if(item != null)
				{
					hasValidItem = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
		}
		Console.print("Du får nu muligheden for at redigere de enkelte felter seperat. Hvis et felt ikke ønskes ændret, springes feltet over med ENTER. Den nuværende værdi i feltet vises i parantes i linien ovenover.");

        Console.print("Indtast varenavn ("+item.getName()+"):");
        String name = Console.readString(true);
        if(!name.equals("")) { item.setName(name); }

        Console.print("Indtast beskrivelse ("+item.getDescription()+"):");
        String description = Console.readString(true);
        if(!description.equals("")) { item.setDescription(description);}

        Console.print("Indtast producent ("+item.getManufacturer()+"):");
        String manufacturer = Console.readString(true);
        if(!manufacturer.equals("")) { item.setManufacturer(manufacturer);}

		Console.print("Indtast leverandør ("+item.getSupplier()+"):");
		String supplier = Console.readString(true);
		//TODO: Supplierfix
		if(!supplier.equals("")) { item.setSupplier(SupplierCollection.getInstance().getSupplier(100)); }

        Console.print("Indtast prisen ("+item.getPrice()+"):");
        Double price = Console.readDouble(true);
        if(price != 0) { item.setPrice(price);}

        Console.print("Indtast anskaffelsesdato ("+item.getAcquisitionDate()+"):");
        Date acquisitionDate = Console.readDate(true);
        if(acquisitionDate != null) {item.setAcquisitionDate(acquisitionDate);}

        Console.print("Indtast lokation for varen:");
        int locationInt = Console.readInt(true);
        Location location;
        if(locationInt == 1)
        {
            location = Location.LumberYard;
        }
        else
        {
            location = Location.HardwareStore;
        }
        item.setLocation(location);

        Console.print("Indtast en værdi for minimumslager:");
        int minimumStock = Console.readInt(true);
        if(minimumStock != 0) {item.setMinimumStock(minimumStock);}

        Console.print("Indtast en værdi for maximumslager:");
        int maximumStock = Console.readInt(true);
        if(maximumStock != 0) {item.setMaximumStock(maximumStock);}

    }

    private void removeItem()
    {
		Console.print("For at slette en vare, skal den først findes.");
		Item item = null;
		boolean hasValidItem = false;
		while(!hasValidItem)
		{
			try
			{
				item = searchProcedure();
				if(item != null)
				{
					hasValidItem = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
      }
      String name = item.getName();
      this.controller.removeItem(item);
      Console.print(name+" er nu slettet fra varedatabasen.");
    }

    private Item searchProcedure() throws Exception
	{
		Console.print("Hvordan vil du finde varen?");
		ArrayList<String> options = new ArrayList<String>();
		options.add("ID");
		options.add("Søgning");
		options.add("Liste");
		Console.printMenu(false, null, options);

		int choice = Console.readChoice(0, 3);
		int id = 0;
		boolean doSomething = true;
		switch(choice)
		{
			case 1:
				Console.print("Indtast varens ID.");
				id = Console.readInt();
				break;
			case 2:
				Console.print("Indtast den ønskede varens ID, som står ude til venstre i listen af søgeresultater.");
				this.findItem(false);
				id = Console.readInt();
				break;
			case 3:
				Console.print("Indtast den ønskede varens ID, som står ude til venstre i listen.");
				this.showList(this.controller.getAllItems());
				id = Console.readInt();
				break;
			case 0:
				doSomething = false;
				break;

		}
		if(doSomething)
		{
			Item item = this.controller.getItem(id);
			if(item != null)
			{
				return item;
			}
			else
			{
				Console.print("Der kunne ikke findes nogen vare med det valgte ID.");
				throw new Exception();
			}
		}
		else
		{
			return null;
		}
	}

    private int showList(ArrayList<Item> items)
    {
        int i = 0;
        for (Item item : items)
        {
            i++;
            Console.print("{"+item.getItemNo()+"} "+item.getName()+"\t"+item.getPrice()+"\t"+item.getManufacturer());
        }
		return i;
    }

    private void showInfo(Item item)
    {
        String location = (item.getLocation() == Location.HardwareStore)?"Byggemarked":"Trælasthandel";
        Console.print("-Lager-");
        Console.print("Navn: "+item.getName()+"\tPris:"+item.getPrice()+" kr.");
        Console.print("Beskrivelse: "+item.getDescription());
        Console.print("Producent:" +item.getManufacturer());
		Console.print("Leverandør:"+item.getSupplier());
        Console.print("Lokation:" +location);
        Console.print("Minimumslager:" +item.getMinimumStock());
        Console.print("Maximumslager:" +item.getMaximumStock());
    }
}
